#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <cassert>
#include "Queue.cpp"

typedef int BTreeDataType;

typedef struct BinaryTreeNode {
    BTreeDataType _data;
    struct BinaryTreeNode* _left;
    struct BinaryTreeNode* _right;
}BTreeNode;

BTreeNode* CreateBTreeNode(BTreeDataType value);
BTreeNode* CreateBinaryTree();
void PrevOrder(BTreeNode* root); // 先序遍历
void InOrder(BTreeNode* root);   // 中序遍历
void PostOrder(BTreeNode* root); // 后序遍历
int BTreeSize(BTreeNode* root);  // 二叉树的结点数
int BTreeLeafSize(BTreeNode* root); // 二叉树的叶子结点数
int BTreeLevelKSize(BTreeNode* root, int k); // 二叉树第k层结点个数
BTreeNode* BinaryTreeFind(BTreeNode* root, BTreeDataType value); // 二叉树查找值为value的结点
void BTreeDestory(BTreeNode* root); // 销毁二叉树
void BTreeLevelOrdef(BTreeNode* root); // 层序遍历
bool BinaryTreeComplete(BTreeNode* root); // 判断二叉树是否是完全二叉树